﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Poco;

namespace Metier
{
    public class GestionServeur
    {
        public void Ajouter(Serveur serveur)
        {
            try
            {
                using (Context db = new Context())
                {
                    db.Utilisateurs.AddObject(serveur);
                    db.SaveChanges();
                }
            }
            catch (ArgumentNullException ex)
            {
                throw new Exception("Erreur Repository : Echec Ajout : Serveur est null", ex);
            }
            catch (Exception ex)
            {
                throw new Exception("Erreur Repository : Echec Ajout Serveur avec l'email : " + serveur.Email, ex);
            }
        }

        public Serveur Chercher(int serveurId)
        {
            try
            {
                using (Context db = new Context())
                {
                    return db.Utilisateurs.OfType<Serveur>().Where(s => s.Id == serveurId).FirstOrDefault();
                }
            }
            catch (ArgumentOutOfRangeException ex)
            {
                throw new Exception("Erreur Repository : Echec Recuperation  ce ServeurId n'existe pas", ex);
            }
            catch (ArgumentNullException ex)
            {
                throw new Exception("Erreur Repository : Echec Recuperation : ServeurId est null", ex);
            }
            catch (Exception ex)
            {
                throw new Exception("Erreur Repository : Echec Recuperation Serveur avec l'id : " + serveurId, ex);
            }
        }

        public Serveur Chercher(string email)
        {
            try
            {
                using (Context db = new Context())
                {
                    return (from s in db.Utilisateurs.OfType<Serveur>()
                            where s.Email == email
                            select s).FirstOrDefault();
                }
            }
            catch (ArgumentNullException ex)
            {
                throw new Exception("Erreur Repository : Echec Recuperation Serveur : email est null", ex);
            }
            catch (Exception ex)
            {
                throw new Exception("Erreur Repository : Echec Recuperation Serveur avec l'email : " + email, ex);
            }
        }

        public Serveur Chercher(Zone zoneAttribuee)
        {
            try
            {
                using (Context db = new Context())
                {
                    return (from s in db.Utilisateurs.OfType<Serveur>()
                            where s.Zone.Id == zoneAttribuee.Id
                            select s).FirstOrDefault();
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Erreur Repository : Echec Recuperation Serveur avec zone attribuee : " + zoneAttribuee, ex);
            }
        }
         
        public List<Serveur> Lister()
        {
            try
            {
                using (Context db = new Context())
                {
                    return db.Utilisateurs.OfType<Serveur>().ToList();
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Erreur Repository : Echec Recuperation tous Serveurs", ex);
            }
        }

        public List<Serveur> Lister(Restaurant restaurant)
        {
            try
            {
                using (Context db = new Context())
                {
                    return (from s in db.Utilisateurs.OfType<Serveur>()
                            where s.Restaurant.Id == restaurant.Id
                            select s).ToList();
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Erreur Repository : Echec Recuperation Serveur avec restaurant : " + restaurant, ex);
            }
        }        

        public void MiseAJour(Serveur serveur)
        {
            try
            {
                using (Context db = new Context())
                {
                    db.Utilisateurs.Attach(serveur);
                    db.ObjectStateManager.ChangeObjectState(serveur, System.Data.EntityState.Modified);
                    db.SaveChanges();
                }
            }
            catch (ArgumentNullException ex)
            {
                throw new Exception("Erreur Repository : Echec Mise a jour Serveur : nouveau Serveur est null", ex);
            }
            catch (Exception ex)
            {
                throw new Exception("Erreur Repository : Echec Mise a jour Serveur avec l'email : " + serveur.Email, ex);
            }
        }

        public void Supprimer(Serveur serveur)
        {
            try
            {
                using (Context db = new Context())
                {
                    db.Utilisateurs.DeleteObject(serveur);
                    db.SaveChanges();
                }
            }
            catch (ArgumentNullException ex)
            {
                throw new Exception("Erreur Repository : Echec Suppression Serveur : Serveur est null", ex);
            }
            catch (Exception ex)
            {
                throw new Exception("Erreur Respository : Echec Suppression Serveur avec l'email : " + serveur.Email, ex);
            }
        }

    }
}
